package com.smart.tool.transaction;

/**
 * @Author gao.gwq
 * @Version BaseAction.java, v 0.1 2024年01月26日 11:31 gao.gwq
 * @Description: TODO
 */
public interface BaseAction<T> {

    /**
     * 正常情况:
     *  1、本方法在doAction之后、beforeCompletion前执行
     * 异常情况:
     * 1、如果该方法抛出异常，事务会回滚。
     * 2、如果 doAction执行的过程中抛出异常，事务会回滚，本方法不会执行
     * 默认为空方法
     * @param transactionContext
     */
    default  void beforeCommit(TransactionContext<T> transactionContext) {
    }

    /**
     * 本方法无论如何都会执行
     *  1、本方法在beforeCommit之后、事务提交前执行
     *  2、本方法抛出异常，不影响事务
     *
     * 默认为空方法
     * @param transactionContext
     */
    default  void beforeCompletion(TransactionContext<T> transactionContext) {
    }

    /**
     * 1、事务提交成功后会执行本方法，如果doAction执行异常或者事务提交异常 本方法不执行
     * 2、如果本方法抛出异常，主链路事务无影响
     * 使用场景：如果需要对事务执行成功后做后置处理(比如消息发送、发送事件等)可以重写本方法
     * 默认是空方法
     * @param transactionContext
     */
    default void afterCommit(TransactionContext<T> transactionContext) {

    }

    /**
     * 本方法无论如何都会执行
     *  1、如果本方法抛出异常，主链路事务无影响
     *  使用场景:如果对事务执行后做后置处理，如果事务无论是否执行成功，都需要做的后置处理，比如日志打印，消息发送等等。
     * 默认是空方法
     * @param transactionContext
     */
    default void afterCompletion(TransactionContext<T> transactionContext) {
    }
}
